import { useGlobalStore } from "~~/store/global";
// import { useEventBus } from "@vueuse/core";
import { navigateBack, isiOS } from "@/utils";
import { compare } from "~/utils/calculation";
import { showDialog } from "vant";
import { JUMPAPPS } from "~/config";

// import { useLogStore } from "~~/store/modules/log";
enum VersionOldEnum {
  yes = 1, // 老版本
  no = 0, // 不是老版本
  unknown = -1, // 未知
}

/**
 * @description: iOS 老版本拦截以后,如果进入新页面,则进行弹窗提示,并且重定向到 coin 页面
 * 1. 比对 BDC MVP版本上线时的 app 版本
 * 2. 比对 是否是中间过度版本（BDC 没有上线，导航会被隐藏,导致无导航的情况发生,这种场景只会出现在早期,蓝包和绿宝上,后续版本(一般)无此问题）是则返回 app，不是则留在老页面
 * @param {object} to
 * @return {*} true 则重定向
 * @author: zhj1214
 */
const compatible = (to: any) => {
  if (!globalStore) globalStore = useGlobalStore();

  // if (globalStore.$state.isDebugger) return; // 是否开启调试: 取消页面的跳转拦截
  // 拦截老版本,不能访问新页面pages
  const fn = () => {
    /**
     * 新页面枚举不完,所以匹配老页面,不是老页面就拦截
     * 1. 抽美金的分享页面,是特例
     * */
    const pages = [
      // "index",
      "coin-coin",
      "FAQ-question",
      "dividends-dividends",
      "recycling-recycling",
      "plan-plan",
      "wallet-wallet",
      "invite-friends-share", // 抽美金邀请好友页面
    ];
    let isJumpNewPage = true;
    pages.forEach((e) => {
      if (to.name && (to.name as string).startsWith(e)) {
        isJumpNewPage = false;
      }
    });
    // 拦截,并且弹窗
    if (isJumpNewPage) {
      const nuxtApp = useNuxtApp();
      // 特殊场景：hiddenBar=1 参数,生效版本，但是 BDC 功能没有上线。会隐藏导航栏,就没有导航了这样的bug
      let compareVersion: any = 0; // 默认返回 app
      if (
        globalStore.packagePrefix === "BtcDana" ||
        globalStore.packagePrefix === "BtcDana.IOS"
      ) {
        if (isiOS.value) {
          const basePackageId = "BtcDana.IOS-1.2.14-com.indone.online-ios";
          compareVersion = compare(globalStore.$state.packageId, basePackageId);
        } else {
          const basePackageId1 = "BtcDana-1.8.83-com.indone.online-android";
          const basePackageId2 = "BtcDana-1.8.86-com.indone.online-android";

          const compareVersion1 = compare(
            globalStore.$state.packageId,
            basePackageId1
          );
          const compareVersion2 = compare(
            globalStore.$state.packageId,
            basePackageId2
          );
          if (compareVersion1 == 1 && compareVersion2 == -1) {
            compareVersion = 0;
          } else {
            compareVersion = -1;
          }
          console.log("--BtcDana--compareVersion:", compareVersion);
        }
      }
      // 绿包
      else if (globalStore.packagePrefix === "BtcDanaAsia") {
        if (isiOS.value) {
          console.error("iOS 暂未上线绿包");
          // const basePackageId = "BtcDana.IOS-1.2.14-com.indone.online-ios";
          // compareVersion = compare(globalStore.$state.packageId, basePackageId);
        } else {
          const basePackageId1 = "BtcDanaAsia-1.0.5-com.indone.online-android";
          const basePackageId2 = "BtcDanaAsia-1.0.8-com.indone.online-android";

          const compareVersion1 = compare(
            globalStore.$state.packageId,
            basePackageId1
          );
          const compareVersion2 = compare(
            globalStore.$state.packageId,
            basePackageId2
          );
          if (compareVersion1 == 1 && compareVersion2 == -1) {
            compareVersion = 0;
          } else {
            compareVersion = -1;
          }
          console.log("--BtcDanaAsia--compareVersion:", compareVersion);
        }
      }
      // 后续版本应该都会有 hiddenBar=1 参数,所以默认停留在 coin 页面,
      else {
        // 后续上线那个 app 了这里标注一下.
        // 1. 24 年 3 月 27 号新加的包BtcDanaElite ,只有安卓
        // 2. 24 年 4月 24 新增 BtcDanaTrading,只有安卓
        // 3. 24 年 6月 27 新增 ForexDanaTrade,只有安卓
        // 4. 24 年 11月 07 新增 ForexDana,只有安卓
        compareVersion = -1;
        console.log("没有导航问题,停留在当前页面:", compareVersion);
      }

      // 2. 弹窗
      showDialog({
        title: nuxtApp.$i18n.t("mvp.other.wxts") || "温馨提示",
        message:
          nuxtApp.$i18n.t("mvp.other.upInstall") ||
          "请将 App 更新到最新版本，在重试",
        confirmButtonText: nuxtApp.$i18n.t("mvp.other.zdl"),
      }).then(() => {
        // 0 版本相同
        if (!compareVersion || compareVersion == 0) {
          console.log("返回APP"); // 因为 hiddenBar=1 未生效
          return navigateBack(-1, true);
        } else {
          // 老版本,告诉他有 BDC 这个功能了,停留在coin页面,让他看看,不做处理
          console.log("停留在原页面,不做处理");
        }
      });

      // 终止跳转
      // return abortNavigation();
      // 重定向
      return true;
    }
  };
  // 1.  比对 BDC MVP版本上线时的 app 版本
  if (
    globalStore.$state.isOldVersion === VersionOldEnum.unknown &&
    globalStore.$state.packageId
  ) {
    // 1.1 根据前缀判断包
    console.log("当前版本：", globalStore.$state.packageId);
    console.log("版本前缀：", globalStore.packagePrefix);
    let basePackageId: any = "";
    let compareVersion: any = -1;

    // 需要兼容的版本号
    const compatibleAndroidList = JUMPAPPS().globalRoute();

    basePackageId = compatibleAndroidList.find((e) => {
      return e.split("-")[0] === globalStore.packagePrefix;
    });

    if (basePackageId) {
      compareVersion = compare(globalStore.$state.packageId, basePackageId);
    }

    // -1 老版本
    if (compareVersion == -1) {
      globalStore.$state.isOldVersion = VersionOldEnum.yes;
      return fn();
    } else {
      globalStore.$state.isOldVersion = VersionOldEnum.no;
    }
  } else if (globalStore.$state.isOldVersion === VersionOldEnum.yes) {
    return fn();
  }
};

/**
 * @description: 时候需要: 重定向到 tabbr 页面
 * @param {any} to
 * @return {*} true 则重定向
 * @author: zhj1214
 */
const tabbarJump = (to: any) => {
  if (!globalStore) globalStore = useGlobalStore();

  // pages顺序很重要
  let isJumpTabbar = -1;
  globalStore.$state.tabBarPages.forEach((e: any, index: number) => {
    if (to.name && (to.name as string).startsWith(e)) {
      isJumpTabbar = index;
    }
  });

  if (isJumpTabbar >= 0) {
    /**
     * @description: 两种场景
     * 1. app 跳转到 h5 coin / rewards / mining / pledge / asset 页面由服务端重定向的场景下,由于这段判断首先在服务端进行执行,到达客户端的时候由于某种原因导致pinia 无法记录 tabBarIdx 这个值
     * 2. app 跳转到 h5 非以上页面,在客户端执行的情况,pinia 可以记录 tabBarIdx
     * @author: zhj1214
     */
    globalStore.$patch((state: any) => {
      state.tabBarIdx = isJumpTabbar;
    });

    return isJumpTabbar;
  }
};
// let logStore: any;
let globalStore: any = null; // 保存一下
export default defineNuxtRouteMiddleware((to: any, from: any) => {
  console.log("from从页面：", from.name, " <=跳转到=> to:", to.name);
  // 1. 页面通知
  // if (from && from.name && from.name.includes("___")) {
  //   const page = useEventBus(`pageUnmount::${from.name.split("___")[0]}`);
  //   page.emit({ from, to });
  // }
  // 1.1 用户行为收集
  // try {
  //   logStore = logStore ? logStore : useLogStore();
  //   logStore.addInfoToList({
  //     time: Date.now(),
  //     type: "Route",
  //     data: JSON.parse(
  //       JSON.stringify({
  //         to: unref({
  //           href: to.href,
  //           path: to.path,
  //           name: to.name,
  //           query: to.query,
  //           params: to.params,
  //         }),
  //         from: unref({
  //           href: from.href,
  //           path: from.path,
  //           name: from.name,
  //           query: from.query,
  //           params: from.params,
  //         }),
  //         desc: `${from.name}<=>${to.name}`,
  //       })
  //     ),
  //   });
  // } catch (error) {
  //   console.log("路由信息报错:", error);
  // }

  if (process.client) {
    // 2. 路由拦截
    const isJump = compatible(to);
    if (isJump) {
      return navigateTo({
        path: "/coin/coin",
      });
    }
    // 3. 如果通过了兼容性拦截校验,则进行 tabbar 重定向判断
    else {
      const isRedirect = tabbarJump(to);
      if (isRedirect != undefined) {
        return navigateTo({
          path: "/tabbar",
          query: { idx: isRedirect },
        });
      }
    }
  }
});
